﻿/**
 * 项目名称：[js工具库]
 * 程序作者：李宁<liningftp@163.com>
 * 创建时间：2008-08-20
 * 修改记录：2008-09-19 00:05 修正lee.cssTextToJsNameJSON函数，支持styleFloat(IE)、支持形如border-right-width的属性
 */

//==================================================================================================命名空间
var lee = lee || {};//命名空间

//==================================================================================================工具函数
/**
 * document.getElementById的简洁形式
 */
lee.$ = function(id){
    return typeof(id) == "object" ? id : document.getElementById(id);
};

/**
 * 检测浏览器是否为IE
 * @return {Boolean} }如果是IE，返回true；否则，返回false。
 */
lee.isIE = (function(){return navigator.appName.indexOf("Microsoft") > -1})();

/**
 * @return {String} 返回时间戳
 */
lee.timestamp = function(){return new Date().getTime();};

/**
 * @return {String} 返回形如：2008-08-30格式的日期时间
 */
lee.gettime = function(){
    function addstart(s){
        return s.length == 2 ? s : "0"+s;
    }
    var time = new Date();
    return time.getFullYear() + 
        "-" + addstart(time.getMonth().toString()) + 
        "-" + addstart(time.getDay().toString()) + 
        " " + addstart(time.getHours().toString()) + 
        ":" + addstart(time.getMinutes().toString()) + 
        ":" + addstart(time.getSeconds().toString());
};

//==================================================================================================Cookie
/**
 * 设置cookie值
 * @name {String} 新项的名称
 * @value {String} 新项的值
 * @hours {Int} 持续存在多少个小时
 * @return {void}
 */
lee.setCookie = function(name, value, hours){
    var expires = "";
    if(hours){
        expires = new Date(new Date().getTime() + hours*3600000);
        expires = ";expires=" + expires.toGMTString();
    }
    document.cookie = name + "=" + encodeURIComponent(value) + expires;
};

/**
 * 获取制定name的cookie值
 * @name {String} 获取项的名称
 * @return {String} 获取项的值
 */
lee.getCookie = function(name){
    var value = "";
    var cookies = document.cookie;
    cookies = cookies.split(';');
    
    for(var i = 0; i < cookies.length; ++i){
        if(cookies[i].length > 1){
            cookies[i] = cookies[i].split('=');
            if(cookies[i][0] == name) 
                value = decodeURIComponent(cookies[i][1]);
        }
    }
    
    return value;
};

//==================================================================================================动态载入资源
////////////////////////////////////////////////////////////////////////////////Script载入
/**
 * “动态脚本标签”导入js文件（如果不是必须，不要使用，因为这种方式在IE下是异步的，而在FireFox下是同步的）
 * @src {String} js文件的url地址
 */
var Script = function(src){
    this.head = document.getElementsByTagName("head").item(0);
	this.scriptObj = document.createElement("script");
    this.src = src;
	this.timestamp = '&timestamp=' + (new Date()).getTime();
};

/**
 * @return {void}
 */
Script.prototype.add = function(){
	this.scriptObj.setAttribute("type","text/javascript");
	this.scriptObj.setAttribute("charset", "gb2312");
	//请求非js文件
	//this.scriptObj.setAttribute("src", this.src + this.timestamp);
	//请求js文件
	this.scriptObj.setAttribute("src", this.src);
	this.head.appendChild(this.scriptObj);
};

/**
 * @return {void} 
 */
Script.prototype.remove = function(){
    this.head.removeChild(this.scriptObj);
};

////////////////////////////////////////////////////////////////////////////////动态添加Css样式
var Css = function(txt){
    this.head = document.getElementsByTagName("head").item(0);
    this.cssObj = document.createElement("style");
    this.cssTxt = txt;
};

Css.prototype.add = function(){
    this.cssObj.setAttribute("type","text/css");
    try{
        this.cssObj.innerHTML = this.cssTxt;
    }catch(e){
        this.cssObj.styleSheet.cssText = this.cssTxt;
    }
    this.head.appendChild(this.cssObj);
};

Css.prototype.remove = function(){
    this.head.removeChild(this.cssObj);
};

//==================================================================================================Css文本解析
/*
 * 将css文本转成JSON对象
 * @cssTxt {String}
 * @return {JSON}
 */
lee.cssTextToJSON = function(cssTxt){
    var s = cssTxt.replace(/[{}]/g, "");        
    var arr = s.split(";");
    var o = {};
    for(var i = 0; i < arr.length; i++){
        if(arr[i].length > 2){
            var arr2 = arr[i].split(':');
            o[arr2[0]] = arr2[1].toString();
        }
    }
    return o;
};

/**
 * 将css样式名转成js中style的属性名
 * @name {String} css样式名
 * @return {String} style属性名
 */
lee.cssStyleNameToJsName = function(name){
    if(name.indexOf('-') > -1){
        var i = name.indexOf('-');
        name = name.substring(0, i) + name.substr(i+1, 1).toUpperCase() + name.substring(i+2);
        return lee.cssStyleNameToJsName(name);
    }
    else{
        return name;
    }
};

/**
 * 将cSS文本转成js中style的属性名对象
 * @name {String} css样式名
 * @return {JSON} style属性名对象
 */
lee.cssTextToJsNameJSON = function(cssTxt){
    var s = cssTxt.replace(/[{}]/g, "");        
    var arr = s.split(";");
    var o = {};
    for(var i = 0; i < arr.length; i++){
        if(arr[i].length > 2){
            var arr2 = arr[i].split(':');
            var name = lee.cssStyleNameToJsName(arr2[0]);
            o[name] = arr2[1].toString();
        }
    }
    
    if(o.float){
        o.cssFloat = o.float;
        o.styleFloat = o.float;
        delete(o.float);  
    }
    return o;
};

//==================================================================================================资源清理
lee.gc = {
	purge : function(d){
	    var a = d.attributes, i, l, n;
	    if(a){
		            debugger;
		    l = a.length;
		    for(i = 0; i < l; ++i){
			    n = a[i].name;
			    if(typeof d[n] === 'function'){
				    d[n] = null;
			    }
		    }
	    }
	    a = d.childNodes;
	    if(a){
		    l = a.length;
		    for(i = 0; i < l; ++i){
			    lee.gc.purge(d.childNodes[i]);
		    }
	    }
	}
};

//==================================================================================================Div类
function Div(o){        
    this.div = o || document.createElement("div");
    this.x = null;
    this.y = null;
    this.width = null;
    this.height = null;
}

/**
 * 添加样式
 * @cssTxt {String} css风格的样式文本（不支持一键多值的形式，如："border:solid 1px red"）
 * @return {void}
 */
Div.prototype.addStyle = function(cssTxt){
    var o = lee.cssTextToJsNameJSON(cssTxt);
    for(var n in o)
        this.div.style[n] = o[n];
    if(o.left && typeof o.left == 'string')
        this.x = parseInt((o.left).match(/\d+/)[0]);
    if(o.top && typeof o.top == 'string')
        this.y = parseInt((o.top).match(/\d+/)[0]);
    
    if(o.width) this.width = o.width;
    if(o.height) this.height = o.height;
};

/**
 * 给div Dom元素添加文本内容
 * @txt {String} 文本内容
 * @return {void}
 */
Div.prototype.addText = function(txt){
    this.div.innerHTML = txt;
};

/**
 * 将this.div添加到指定dom中
 * @parent {HTMLElement}
 * @return {void}
 */
Div.prototype.appendParent = function(parent){
    this.parent = parent;
    this.parent.appendChild(this.div);
};

/**
 * 将this.div的对象绑定清空，并从父节点中删除
 * @return {void}
 */
Div.prototype.removeSelf = function(){
    lee.gc.purge(this.div);
    if(this.parent)
        this.parent.removeChild(this.div);
};

/**
 * 移除所有字节点
 */
Div.prototype.removeAllChild = function(){
    while(true){
        if(this.div.childNodes[0]){
            this.div.removeChild(this.div.childNodes[0]);
        }
        else break;
    }
};

/**
 * 向this.div添加事件绑定
 * @return {void}
 */
Div.prototype.addEvent = function(type, func){
    if(this.div.attachEvent)
        this.div.attachEvent("on" + type, func);
    else if(this.div.addEventListener)
        this.div.addEventListener(type, func, false);
};

//==================================================================================================事件方法
lee.addEvent = function(node, type, func){
    if(node.attachEvent)
        node.attachEvent("on" + type, func);
    else if(node.addEventListener)
        node.addEventListener(type, func, false);
};

lee.addStyle = function(el, cssText){
    var o = lee.cssTextToJsNameJSON(cssText);
    for(var n in o)
        el.style[n] = o[n];
};

lee.addStyleToHead = function(css) {
	var style = document.createElement('style');
	style.type = 'text/css';
	if(this.isIE){
		style.styleSheet.cssText = css;  
	}else{
		style.innerHTML = css;
	}
	document.getElementsByTagName('head')[0].appendChild(style);
};
//==================================================================================================获取位置坐标
/**
 * 位置坐标类
 * @e {Event} 鼠标事件
 * @param {Int} n 表示参考对象为“最近源对象”的n级父对象,n=0时表示自己
 */
function Position(e, n){
    this.mouseX = e.clientX;
    this.mouseY = e.clientY;
    
    //IE--e.srcElement;FF--e.target
    this.target = e.srcElement || e.target;
    if(n > 0){
        for(var i = 0; i < n; ++i)
            this.target = this.target.parentNode;
    }
    this.targetTop = this.target.offsetTop;
    this.targetLeft = this.target.offsetLeft;
    this.targetWidth = this.target.offsetWidth;
    this.targetHeight = this.target.offsetHeight;
};

//==================================================================================================信息输出台
lee.console = {
    counter:0,        
    main:null,
    width:0,
    height:0,
    
    init:function(width, height){
        lee.console.width = width;
        lee.console.height = height;
        var div = new Div();
        div.addStyle("position:absolute;top:1px;right:1px;width:" + width + "px;height:" + height + "px;border-style:solid;border-width:2px;border-color:#99aaee;overflow-x:scroll;overflow-y:scroll;");
        div.appendParent(document.body);
        lee.console.main = div;
    },
    
    goBottom:function(){
        lee.console.main.div.scrollTop = lee.console.main.div.scrollHeight;
    },
    
    out:function(s){
        var div = new Div();
        div.addStyle("{width:" + (lee.console.width - 17) + "px;height:20px;padding-top:2px;font-size:14px;}");
        if(s != "\n" && s != "n"){
            if(++lee.console.counter%2 == 1)
                div.addStyle("{background-color:#99aaee;}");
            else    
                div.addStyle("{background-color:#ccd6ff;}");
            div.addText(s);
        }
        else{
            div.addStyle("{background-color:orange;}");
        }
        div.appendParent(lee.console.main.div);
        lee.console.goBottom();
    },
    
    clear:function(){
        
    }
};
//==================================================================================================Array工具
/**
 * 返回指定元素在数组中的索引
 * @arr {Array}
 * @o {Object} 指定元素
 * @return {Int} 元素的索引，不存在返回-1
 */
Array.indexOf = function(arr, o){/*return:int, ok:> -1, none:-1*/
    for(var i = 0; i < arr.length; i++){
        if(arr[i] == o)
            return i;
    }
    return -1;
};

Array.remove = function(arr, o){/*return:Array*/
	var res = [];
	for(var i = 0; i < arr.length; i++){
		if(arr[i] == o){
			while(i < arr.length - 1){
				res[i] = arr[++i];
			}
			break;
		}
		res[res.length] = arr[i];
	}
	return res;
}

/**
 * 交换索引i和j的对应的元素
 * @arr {Array}
 * @i {Int}
 * @j {Int}
 * @return {void}
 */
Array.exchange = function(arr, i, j){
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
};

/**
 * 移动数组元素
 * @arr {Array}
 * @i {Int} 移动起始位置
 * @j {Int} 移动终点位置
 * @return {void}
 */
Array.move = function(arr, i, j){
    var temp = arr[i];
    while(i < j){
        arr[i] = arr[++i];
    }
    arr[j] = temp;
};

/**
 * 查找指定元素在指定数组中存在的个数
 * @array {Arrray}指定的数组
 * @value {Object}指定的元素
 * @return {Int}存在的个数
 */
Array.hasValue = function(array, value){
    var counter = 0;
    for(var i = 0; i < array.length; ++i)
        if(array[i] == value)
            ++counter;
    return counter;
};

/**
 * 去除数组中重复的元素，相同的元素只保留一个
 * @array {Arrray} 指定的数组
 * @return {Array} 经过浓缩之后的新数组
 */
Array.trimRepeat = function(array){
    var arr = [];
    for(var i = 0; i < array.length; ++i)
        if(Array.hasValue(arr, array[i]) == 0)
            arr[arr.length] = array[i];
    return arr;
};

/**
 * 将新元素插入到数组的指定位置
 * @param {Array} array 原数组
 * @param {Object} o 新对象
 * @param {Int} i 指定索引位置
 * @return void
 */
Array.insert = function(array, o, n){
    if(n < 0 || n > array.length) return -1;
    var i = array.length;
    while(i > n)
        array[i] = array[--i];
    array[i] = o;
};

/**
 * 将新元素插入到参考元素的前面
 * @param {Array} array 原数组
 * @param {Object} o 新对象
 * @param {Object} c 参考元素
 * @return void
 */
Array.insertBefore = function(array, o, c){
    var i = Array.indexOf(array, c);
    Array.insert(array, o, i);
}

/**
 * 将新元素插入到参考元素的后面
 * @param {Array} array 原数组
 * @param {Object} o 新对象
 * @param {Object} c 参考元素
 * @return void
 */
Array.insertAfter = function(array, o, c){
    var i = Array.indexOf(array, c);
    Array.insert(array, o, (i + 1));
}

//==================================================================================================String
String.toJSON = function(txt){
	s = "[" + txt + "]";
	try{
		return eval(s)[0];
	}
	catch(e){
		return txt;
	}
};

/**
 * 去除字符串首尾空格，2008-09-20 09:03
 * @param {String} s --原字符串
 * @return {String} 新字符串
 */
String.trim = function(s){
    return s.replace(/(^\s*)|(\s*$)/g, '');
};

//==================================================================================================Event
lee.event = {
    add : function(el, type, func){
        if(window.attachEvent){
            el.attachEvent('on'+type, func);
        }
        else if(window.addEventListener){
            el.addEventListener(type, func, false);
        }
    }
};

//==================================================================================================Ajax
function Ajax(method, url, data, callback){
//    this.method = method;
//    this.url = url;
//    if(data) this.data = data;
//    this.callback = callback;
    
    var o = (function(){
		if(window.ActiveXObject){
			return new ActiveXObject("Microsoft.XMLHTTP");
		}
		else if(window.XMLHttpRequest){
			return new XMLHttpRequest();
		}
	})();
	
	var head = function(){
		o.open("HEAD", url + "?timestamp=" + new Date().getTime().toString(), true);
		o.onreadystatechange = response;
		try{
		o.send(null);
		}catch(e){
		} 
	};
	
	var get = function(){
		o.open("GET", url + "?timestamp=" + new Date().getTime().toString(), true);
		o.onreadystatechange = response;
		o.send(null);
	};
	
	var post = function(data){
		o.open("POST", url, true);
		o.onreadystatechange = response;
		o.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		o.send(data);
	};
	
	var response = function(){
		if(o.readyState == 4){
		    debugger;
		    try{
		        netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
			}catch(e){}
		    if(o.status == 200){
			    callback(o.responseText);
		    }
		}
	};
	
	this.xhr = function(){
	    return o;
	};
	
	this.request = function(){
	    switch(method.toUpperCase()){
	        case "GET":
			    get();
	            break;
	        case "POST":
	            post(data);
	            break;
	        case "HEAD":
	            head();
	            break;
	    }
	};
}
//==================================================================================================iframe-push
lee.push =  {
    connection   : false,
    iframediv    : false,
	
    //接收回调函数
    recv: null,
    
    initialize: function(src, recv) {
        lee.push.recv = recv;
        if(navigator.appVersion.indexOf("MSIE") != -1) {
            // For IE browsers
            lee.push.connection = new ActiveXObject("htmlfile");
            lee.push.connection.open();
            lee.push.connection.write("<html>");
            //lee.push.connection.write("<script>document.domain = '"+document.domain+"'");
            lee.push.connection.write("</html>");
            lee.push.connection.close();
            lee.push.iframediv = lee.push.connection.createElement("div");
            lee.push.connection.appendChild(lee.push.iframediv);
            lee.push.connection.parentWindow.recv = lee.push.recv;
            lee.push.iframediv.innerHTML = "<iframe id='lee.push_iframe' src=" + src + "></iframe>";
        } 
        else if (navigator.appVersion.indexOf("KHTML") != -1) {
            // for KHTML browsers.[i.e:(KDE)Konqueror/Safari(WebKit)]
            lee.push.connection = document.createElement('iframe');
            lee.push.connection.setAttribute('id', 'lee.push_iframe');
            lee.push.connection.setAttribute('src', src);
            with (lee.push.connection.style) {
                position   = "absolute";
                left       = top   = "-100px";
                height     = width = "1px";
                visibility = "hidden";
            }
            document.body.appendChild(lee.push.connection);
        }
        else{
            // For other browser (Firefox...)
            lee.push.connection = document.createElement('iframe');
            lee.push.connection.setAttribute('id', 'lee.push_iframe');
            with(lee.push.connection.style){
                left       = top   = "-100px";
                height     = width = "1px";
                visibility = "hidden";
                display    = 'none';
            }
            lee.push.iframediv = document.createElement('iframe');
            lee.push.iframediv.setAttribute('src', src);
            lee.push.connection.appendChild(lee.push.iframediv);
            document.body.appendChild(lee.push.connection);
        }
    },

    onUnload: function() {
        if (lee.push.connection) {
            lee.push.connection = false; 
        }
    }
};

//==================================================================================================dynamic script
//var dscript = function(src){
//    this.head = document.getElementsByTagName("head").item(0);
//	this.scriptObj = document.createElement("script");
//    this.src = src;
//	this.timestamp = '&timestamp=' + (new Date()).getTime();
//};
//			  
////需要重新定义
//dscript.prototype.callback = null;

//dscript.prototype.send = function(){
//	this.scriptObj.setAttribute("type","text/javascript");
//	this.scriptObj.setAttribute("charset", "gb2312");
//	this.scriptObj.setAttribute("src", this.src + "?callback=" + this.callback + "&timestamp=" + this.timestamp);
//	this.head.appendChild(this.scriptObj);
//};

//dscript.prototype.remove = function(){
//    this.head.removeChild(this.scriptObj);
//};
//==================================================================================================